/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.hibernate.util;

import com.myapp.hibernate.model.Usuario;
import java.util.ArrayList;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author aacede
 */
public class UsuarioUtil {

    private Session sesion;
    private Transaction tx;

    private void iniciaOperacion() throws HibernateException {
        sesion = HibernateUtil.getSessionFactory().openSession();
        tx = sesion.beginTransaction();
    }

    private void manejaExcepcion(HibernateException e) throws HibernateException {
        tx.rollback();
        throw new HibernateException("Ocurrió un error en la capa de acceso a datos. Usuario", e);
    }

    public Usuario obtenerUsuario(int idUsuario) throws HibernateException {
        Usuario contacto = new Usuario();
        try {
            iniciaOperacion();
            contacto = (Usuario) sesion.get(Usuario.class, idUsuario);
        } finally {
            sesion.close();
        }

        return contacto;
    }

    public ArrayList<Usuario> obtenerListaUsuarios() throws HibernateException {
        ArrayList<Usuario> lista = new ArrayList<Usuario>();
        try {
            iniciaOperacion();
            lista = (ArrayList<Usuario>) sesion.createQuery("from Usuario").list();
        } finally {
            sesion.close();
        }
        return lista;
    }

    public void actualizaUsuario(Usuario usuarioAActualizar) {
        try {
            iniciaOperacion();
            sesion.update(usuarioAActualizar);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        }
    }

    public void guardar(Usuario nuevo) {
        try {
            iniciaOperacion();
            sesion.save(nuevo);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        } finally {
            sesion.close();
        }
    }

    public void borrar(Usuario usu) {
        ApuestaUtil apuesta = new ApuestaUtil();
        EntradaUtil entrada = new EntradaUtil();
        apuesta.borrarReferencias(usu.getIdUsuario());
        entrada.borrarReferenciasPorUsuario(usu.getIdUsuario());
        try {
            iniciaOperacion();
            sesion.delete(usu);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        }
    }

    public Usuario obtenerUsuarioLogin(String email, String pass) throws HibernateException {
        Usuario u = new Usuario();
        try {
            iniciaOperacion();
            u = (Usuario) sesion.createQuery("from Usuario where email='" + email + "' and pass ='" + pass + "'").uniqueResult();
        } catch (Exception ex) {
            System.out.print(ex.getMessage());
        } finally {
            sesion.close();
        }
        return u;
    }

    public Usuario obtenerUsuarioPorEmail(String email) throws HibernateException {
        Usuario u = new Usuario();
        try {
            iniciaOperacion();
            u = (Usuario) sesion.createQuery("from Usuario where email='" + email + "'").uniqueResult();
        } catch (Exception ex) {
            System.out.print(ex.getMessage());
        } finally {
            sesion.close();
        }
        return u;
    }
}
